﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Contract.Business.Process;
using Contract.Business.Entity;
using Contract.Business.Filter;
using Fast.Presentation.Bematech;
using Fast.Presentation.Print;
using Fast.Presentation.WinForms.Factory;
using GenericControlsWinForm.Extensions;

namespace Fast.Presentation.WinForms.Cruds
{
    public partial class FrmVenda : Form
    {
        public FrmVenda()
        {
            InitializeComponent();
            this.txtTelefone.LostFocus += new EventHandler(txtTelefone_LostFocus);
            this.txtCodigo.LostFocus += new EventHandler(txtCodigo_LostFocus);
            this.txtCodigoMetade.LostFocus += new EventHandler(txtCodigoMetade_LostFocus);
            this.txtQuantidade.LostFocus += new EventHandler(txtQuantidade_LostFocus);
            this.txtTaxaEntrega.LostFocus += new EventHandler(calcularVenda);
            this.txtDesconto.LostFocus += new EventHandler(txtDesconto_LostFocus);
            this.txtAcrescimo.LostFocus += new EventHandler(txtAcrescimo_LostFocus);
        }

        #region Singleton

        private BPCliente bpCliente;
        private BPCliente processCliente
        {
            get
            {
                if (bpCliente == null)
                    bpCliente = new BPCliente();

                return bpCliente;
            }
        }

        private BPVenda bpVenda;
        private BPVenda processVenda
        {
            get
            {
                if (bpVenda == null)
                    bpVenda = new BPVenda();

                return bpVenda;
            }
        }

        private BPRegiaoEntrega bpRegiaoEntrega;
        private BPRegiaoEntrega processRegiaoEntrega
        {
            get
            {
                if (bpRegiaoEntrega == null)
                    bpRegiaoEntrega = new BPRegiaoEntrega();

                return bpRegiaoEntrega;
            }
        }

        private BPSubGrupoTamanho bpSubGrupoTamanho;
        private BPSubGrupoTamanho processSubGrupoTamanho
        {
            get
            {
                if (bpSubGrupoTamanho == null)
                    bpSubGrupoTamanho = new BPSubGrupoTamanho();

                return bpSubGrupoTamanho;
            }
        }

        private BPProduto bpProduto;
        private BPProduto processProduto
        {
            get
            {
                if (bpProduto == null)
                    bpProduto = new BPProduto();

                return bpProduto;
            }
        }

        private BPSaidaChegada bpSaidaChegada;
        private BPSaidaChegada processSaidaChegada
        {
            get
            {
                if (bpSaidaChegada == null)
                    bpSaidaChegada = new BPSaidaChegada();

                return bpSaidaChegada;
            }
        }
        #endregion

        #region *** Atributos ***

        BEVenda entidade;
        BEConfiguracao config;
        BECliente cliente;
        List<BEVendaItem> listaItens;
        List<BEProduto> todosProdutos;
        Dictionary<int, decimal> formasPagamento;
        bool alterandoProdutoPrincipal = false;
        string descricaoPagamento;
        List<BESubGrupoTamanho> tamanhosBebidas;

        #endregion

        #region *** Eventos ***

        #region Telefone
        void txtTelefone_LostFocus(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(this.txtTelefone.Text))
                    LimparCamposCliente();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void txtTelefone_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.txtTelefone.Text.Length == 9)
                    consultarCliente();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void txtTelefone_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.Enter)
                {
                    if (String.IsNullOrEmpty(this.txtTelefone.Text))
                        Utilidades.ExibirMensagem("Preencha o telefone");
                    else
                    {
                        if (this.txtTelefone.Text.Length != 8)
                            Utilidades.ExibirMensagem("Telefone incorreto, favor digitar os 8 dígitos.");
                        else
                            consultarCliente();
                    }
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }
        #endregion

        #region Formulário
        private void FrmVenda_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                switch (e.KeyCode)
                {
                    case Keys.F1:
                        executarF1();
                        break;
                    case Keys.F2:
                        executarF2();
                        break;
                    case Keys.F8:
                        executarF8();
                        break;
                    case Keys.F10:
                        executarF10();
                        break;
                    case Keys.F11:
                        executarF11();
                        break;
                    case Keys.F12:
                        executarF12();
                        break;
                    default:
                        break;
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void FrmVenda_Load(object sender, EventArgs e)
        {
            try
            {
                carregarRegiaoEntrega();
                carregarProdutos();
                BPConfiguracao processConfig = new BPConfiguracao();
                config = processConfig.ObterTodos(new FEConfiguracao()).First();

                listaItens = new List<BEVendaItem>();
                this.txtTelefone.Focus();

                this.dgvItem.AutoGenerateColumns = false;
                lblData.Text = DateTime.Now.ToShortDateString() + " - " + DateTime.Now.ToShortTimeString();

                marcarDiaAtual();

                //Buscando os tamanhos das bebidas
                tamanhosBebidas = processSubGrupoTamanho.ObterTodos(new FESubGrupoTamanho() { CodigoSubGrupo = 3 });
                tamanhosBebidas.AddRange(processSubGrupoTamanho.ObterTodos(new FESubGrupoTamanho() { CodigoSubGrupo = 4 }));

                //Carregando motoboy
                this.dgvSaidaChegada.AutoGenerateColumns = false;
                this.cboMotoboy.DataSource = UtilidadesListas.buscarMotoboys();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }
        #endregion

        #region Botões
        private void btnConfirmar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.ValidarFormulario())
                {
                    entidade = new BEVenda();
                    if (this.lblCodigo.Text != "...")
                        entidade.Codigo = int.Parse(this.lblCodigo.Text);

                    entidade.Cliente = new BECliente()
                    {
                        Codigo = this.cliente.Codigo,
                        Nome = this.lblNome.Text,
                        Endereco = this.cboEndereco.Text,
                        TelResidencial = this.txtTelefone.Text
                    };

                    entidade.EnderecoEntrega = new BEEnderecoCliente()
                    {
                        Endereco = this.cboEndereco.Text
                    };

                    entidade.CodigoRegiaoEntrega = Convert.ToInt32(this.cboTaxaEntrega.SelectedValue.ToString());
                    entidade.DataVenda = DateTime.Today;
                    entidade.Hora = DateTime.Now.ToShortTimeString();
                    entidade.ValorTaxaEntrega = this.txtTaxaEntrega.Valor;
                    entidade.ValorTotal = this.txtTotal.Valor;
                    entidade.ValorTroco = this.txtTroco.Valor;
                    entidade.Desconto = this.txtDesconto.Valor;
                    entidade.Acrescimo = this.txtAcrescimo.Valor;
                    entidade.Observacao = this.txtObservacao.Text;
                    entidade.Itens = this.listaItens;
                    entidade.Pagamentos = montarPagamentos();

                    FrmConfirmacaoVenda frm = new FrmConfirmacaoVenda();
                    frm.venda = entidade;
                    frm.ShowDialog();

                    if (frm.confirmado)
                    {
                        entidade = processVenda.Salvar(entidade);

                        ImprimirVenda();

                        Utilidades.ExibirMensagem("Venda registrada com sucesso.");

                        carregarSaidaChegada();

                        this.LimparCampos();
                    }
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void btnAdicionar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarFormularioItem())
                {
                    BEVendaItem item = new BEVendaItem();
                    item.Produto = (BEProduto)this.cboItem.SelectedItem;

                    if (!String.IsNullOrEmpty(this.txtCodigoMetade.Text))
                        item.ProdutoMetade = (BEProduto)this.cboMetade.SelectedItem;

                    item.Tamanho = (BETamanho)this.cboTamanho.SelectedItem;
                    item.Desconto = 0;
                    item.Quantidade = int.Parse(this.txtQuantidade.Text);
                    item.ValorUnitario = decimal.Parse(this.txtValorUnitario.Text);
                    item.ValorTotal = decimal.Parse(this.txtValorTotal.Text);
                    item.Borda = this.chkBorda.Checked;
                    item.Cupom = this.chkCupom.Checked;
                    item.Observacao = this.txtObservacaoItem.Text;
                    if (item.Produto.SubGrupo.CodigoGrupo == config.CodigoGrupoPizza)
                    {
                        if (!this.chkBorda.Checked)
                        {
                            if (this.rdbQuinta.Checked)
                            {
                                if (MessageBox.Show("Quinta-feira o cliente ganha borda de cortesia, deseja selecionar alguma borda?", Utilidades.GetProjectName(), MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                                {
                                    FrmTipoBordaEscolher frm = new FrmTipoBordaEscolher();
                                    frm.ShowDialog();
                                    if (frm.tipoBorda.HasValue)
                                    {
                                        item.TipoBorda = (short)frm.tipoBorda;
                                        item.Borda = true;
                                    }
                                }
                            }
                        }
                        else
                            item.TipoBorda = Convert.ToInt16(this.txtCodigoBorda.Text);
                    }

                    listaItens.Add(item);

                    this.dgvItem.DataSource = new object();
                    this.dgvItem.DataSource = listaItens;

                    this.LimparCamposItem();

                    calcularTotalVenda();

                    this.txtCodigo.Focus();
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Deseja limpar os dados da venda?", "Fast Pizza", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == System.Windows.Forms.DialogResult.Yes)
                    this.LimparCampos();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            this.ImprimirVenda();
        }
        #endregion

        #region Campos dos Itens
        void txtQuantidade_LostFocus(object sender, EventArgs e)
        {
            try
            {
                atualizarPreco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void chkCupom_CheckedChanged(object sender, EventArgs e)
        {
            atualizarPreco();
        }

        private void chkBorda_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                atualizarPreco();
                if (this.chkBorda.Checked)
                {
                    FrmTipoBordaEscolher frm = new FrmTipoBordaEscolher();
                    frm.ShowDialog();

                    if (frm.tipoBorda.HasValue)
                    {
                        this.txtCodigoBorda.Text = ((short)frm.tipoBorda).ToString();
                        this.txtBorda.Text = frm.tipoBordaDescricao;
                    }
                    else
                    {
                        if (MessageBox.Show("Cliente pediu borda na pizza, deseja tirar a borda?", Utilidades.GetProjectName(), MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                            this.chkBorda.Checked = false;
                        else
                        {
                            frm.ShowDialog();
                            if (frm.tipoBorda.HasValue)
                            {
                                this.txtCodigoBorda.Text = ((short)frm.tipoBorda).ToString();
                                this.txtBorda.Text = frm.tipoBordaDescricao;
                            }
                            else
                                this.chkBorda.Checked = false;
                        }
                    }
                }
                else
                {
                    this.txtCodigoBorda.Apagar();
                    this.txtBorda.Apagar();
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboTamanho_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                atualizarPreco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboItem_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (this.cboItem.SelectedValue != null && int.Parse(this.cboItem.SelectedValue.ToString()) > 0)
                {
                    this.txtCodigo.Text = this.cboItem.SelectedValue.ToString();
                    int codigoGrupo = ((BEProduto)this.cboItem.SelectedItem).SubGrupo.CodigoGrupo;
                    if (config.CodigoGrupoBebida == codigoGrupo)
                    {
                        this.txtCodigoMetade.Enabled = false;
                        this.txtCodigoMetade.Apagar();
                        this.cboMetade.Enabled = false;
                        this.cboMetade.SelectedValue = 0;
                        this.chkBorda.Checked = false;
                        this.chkBorda.Enabled = false;
                        this.chkCupom.Checked = false;
                        this.chkCupom.Enabled = false;
                    }
                    else
                    {
                        this.chkBorda.Enabled = true;
                        this.chkCupom.Enabled = true;
                        this.txtCodigoMetade.Enabled = true;

                        int codigoGrupoMetade = 0;
                        if (this.cboMetade.Enabled)
                            codigoGrupoMetade = int.Parse(this.cboMetade.SelectedValue.ToString());
                        else
                            this.cboMetade.Enabled = true;

                        if (codigoGrupo != codigoGrupoMetade)
                        {
                            List<BEProduto> novaLista = todosProdutos.Where(q => q.SubGrupo.CodigoGrupo == codigoGrupo).ToList();
                            novaLista = novaLista.OrderBy(q => q.Descricao).ToList();
                            novaLista.Insert(0, todosProdutos.Where(q => q.Codigo == 0).First());

                            alterandoProdutoPrincipal = true;
                            this.cboMetade.DataSource = novaLista;
                            this.cboMetade.SelectedValue = 0;
                            this.txtCodigoMetade.Apagar();
                            alterandoProdutoPrincipal = false;
                        }

                        this.txtCodigoMetade.Focus();
                    }

                    carregarTamanho(((BEProduto)this.cboItem.SelectedItem).CodigoSubGrupo);
                }
                else
                {
                    this.txtCodigo.Apagar();
                    this.txtCodigoMetade.Enabled = false;
                    this.txtCodigoMetade.Apagar();
                    this.cboMetade.Enabled = false;
                    this.cboMetade.SelectedValue = 0;
                    this.cboTamanho.Enabled = false;
                    this.cboTamanho.SelectedValue = 0;
                }

                atualizarPreco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboMetade_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (!alterandoProdutoPrincipal)
                {
                    if (this.cboMetade.SelectedValue != null && int.Parse(this.cboMetade.SelectedValue.ToString()) > 0)
                        this.txtCodigoMetade.Text = this.cboMetade.SelectedValue.ToString();
                    else
                        this.txtCodigoMetade.Apagar();

                    atualizarPreco();
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        void txtCodigo_LostFocus(object sender, EventArgs e)
        {
            try
            {
                if (!String.IsNullOrEmpty(this.txtCodigo.Text))
                {
                    BEProduto prod = processProduto.ObterEntidade(int.Parse(this.txtCodigo.Text));

                    if (prod == null)
                    {
                        this.txtCodigo.Apagar();
                        this.cboItem.Focus();
                    }
                    else
                    {
                        this.cboItem.SelectedValue = prod.Codigo;
                        this.txtCodigoMetade.Focus();
                    }
                }
                atualizarPreco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        void txtCodigoMetade_LostFocus(object sender, EventArgs e)
        {
            try
            {
                if (!String.IsNullOrEmpty(this.txtCodigoMetade.Text))
                {
                    BEProduto prod = processProduto.ObterEntidade(int.Parse(this.txtCodigoMetade.Text));

                    if (prod == null)
                    {
                        this.txtCodigoMetade.Apagar();
                        this.cboMetade.Focus();
                    }
                    else
                    {
                        this.cboMetade.SelectedValue = prod.Codigo;
                        this.chkBorda.Focus();
                    }
                }
                atualizarPreco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void dgvItem_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.Delete)
                {
                    if (this.dgvItem.SelectedRows.Count == 0)
                        Utilidades.ExibirMensagem("Por favor, selecione um item.");
                    else
                    {
                        int index = this.dgvItem.SelectedRows[0].Index;
                        this.listaItens.RemoveAt(index);

                        this.dgvItem.DataSource = new object();
                        this.dgvItem.DataSource = this.listaItens;

                        this.calcularTotalVenda();
                    }
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void dgvItem_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex >= 0)
                {
                    if (e.ColumnIndex == 8)
                    {
                        int rowIndex = e.RowIndex;
                        BEVendaItem item = listaItens[rowIndex];
                        if (item.Produto.SubGrupo.CodigoGrupo == Utilidades.Configuracao().CodigoGrupoPizza)
                        {
                            if (item.Borda.HasValue && item.Borda.Value)
                            {
                                //Retira a borda
                                item.Borda = false;
                                item.TipoBorda = null;

                                if (!this.rdbQuinta.Checked)
                                {
                                    item.ValorUnitario -= config.ValorBorda;
                                    item.ValorTotal -= config.ValorBorda * item.Quantidade;
                                }

                                this.dgvItem.DataSource = new object();
                                this.dgvItem.DataSource = listaItens;

                                calcularTotalVenda();
                            }
                            else
                            {
                                //Adiciona a borda
                                FrmTipoBordaEscolher frm = new FrmTipoBordaEscolher();
                                frm.ShowDialog();
                                if (frm.tipoBorda.HasValue)
                                {
                                    item.TipoBorda = (short)frm.tipoBorda;
                                    item.Borda = true;

                                    if (!this.rdbQuinta.Checked)
                                    {
                                        item.ValorUnitario += config.ValorBorda;
                                        item.ValorTotal += config.ValorBorda * item.Quantidade;
                                    }

                                    this.dgvItem.DataSource = new object();
                                    this.dgvItem.DataSource = listaItens;

                                    calcularTotalVenda();
                                }
                            }
                        }
                    }
                    else if (e.ColumnIndex == 9)
                    {
                        int rowIndex = e.RowIndex;
                        BEVendaItem item = listaItens[rowIndex];
                        if (item.Produto.SubGrupo.CodigoGrupo == Utilidades.Configuracao().CodigoGrupoPizza)
                        {
                            if (item.Cupom)
                            {
                                //Retira o cupom
                                item.Cupom = false;

                                item.ValorTotal = item.ValorUnitario * item.Quantidade;
                            }
                            else
                            {
                                //Retira o cupom
                                item.Cupom = true;

                                if (item.Borda.HasValue && item.Borda.Value && !this.rdbQuinta.Checked)
                                    item.ValorTotal = config.ValorBorda * item.Quantidade;
                                else
                                    item.ValorTotal = 0;
                            }

                            //Atualiza os itens
                            this.dgvItem.DataSource = new object();
                            this.dgvItem.DataSource = listaItens;

                            calcularTotalVenda();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                Utilidades.ExibirMensagem(Utilidades.BuscarMensagemError());
            }
        }

        #endregion

        #region Labels

        private void lblF2_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void lblF2_MouseLeave(object sender, EventArgs e)
        {
            Cursor = DefaultCursor;
        }

        private void lblF8_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void lblF8_MouseLeave(object sender, EventArgs e)
        {
            Cursor = DefaultCursor;
        }

        private void lblF10_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void lblF10_MouseLeave(object sender, EventArgs e)
        {
            Cursor = DefaultCursor;
        }

        private void lblF11_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void lblF11_MouseLeave(object sender, EventArgs e)
        {
            Cursor = DefaultCursor;
        }

        private void lblF12_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void lblF12_MouseLeave(object sender, EventArgs e)
        {
            Cursor = DefaultCursor;
        }

        private void lblPagamento_MouseHover(object sender, EventArgs e)
        {
            Cursor = Cursors.Hand;
        }

        private void lblPagamento_MouseLeave(object sender, EventArgs e)
        {
            Cursor = DefaultCursor;
        }

        private void lblPagamento_Click(object sender, EventArgs e)
        {
            executarF1();
        }

        private void lblF2_Click(object sender, EventArgs e)
        {
            executarF2();
        }

        private void lblF8_Click(object sender, EventArgs e)
        {
            executarF8();
        }

        private void lblF10_Click(object sender, EventArgs e)
        {
            executarF10();
        }

        private void lblF11_Click(object sender, EventArgs e)
        {
            executarF11();
        }

        private void lblF12_Click(object sender, EventArgs e)
        {
            executarF12();
        }

        #endregion

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                lblData.Text = DateTime.Now.ToShortDateString() + " - " + DateTime.Now.ToShortTimeString();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        void calcularVenda(object sender, EventArgs e)
        {
            try
            {
                try
                {
                    if (String.IsNullOrEmpty(this.txtTaxaEntrega.Text))
                        this.txtTaxaEntrega.Text = "0,00";

                    calcularTotalVenda();
                    calcularTroco();
                }
                catch (Exception ex)
                {
                    Utilidades.LogarError(ex);
                    MessageBox.Show(Utilidades.BuscarMensagemError());
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        void txtDesconto_LostFocus(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(this.txtDesconto.Text))
                    this.txtDesconto.Text = "0,00";
                else
                    this.txtDesconto.Text = txtDesconto.Valor.ToString("N2");

                calcularTotalVenda();
                calcularTroco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        void txtAcrescimo_LostFocus(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(this.txtAcrescimo.Text))
                    this.txtAcrescimo.Text = "0,00";

                calcularTotalVenda();
                calcularTroco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboTaxaEntrega_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                BERegiaoEntrega entidade = (BERegiaoEntrega)this.cboTaxaEntrega.SelectedItem;
                this.txtTaxaEntrega.Text = entidade.ValorTaxa.ToString("N2");
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        #region Controle de Saída/Chegada
        private void btnSalvarEntregaSaida_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.cboMotoboy.SelectedValue.ToString() == "0")
                    Utilidades.ExibirMensagem("Selecione um motoboy");
                else
                {
                    List<BESaidaChegada> saidasChegadas = montarSaidaChegada();

                    if (saidasChegadas != null && saidasChegadas.Count > 0)
                    {
                        processSaidaChegada.SalvarLista(saidasChegadas);

                        Utilidades.ExibirMensagem("Saídas/Entradas registradas");

                        this.cboMotoboy.SelectedIndex = 0;
                        carregarSaidaChegada();
                    }
                    else
                        Utilidades.ExibirMensagem("Nenhuma saída/entrada selecionada");
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void cboMotoboy_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                carregarSaidaChegada();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void dgvSaidaChegada_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                int rowIndex = e.RowIndex;

                if (e.ColumnIndex == 0 && (this.dgvSaidaChegada.Rows[rowIndex].Cells[0].Value == null || bool.Parse(this.dgvSaidaChegada.Rows[rowIndex].Cells[0].Value.ToString())))
                {
                    if (this.dgvSaidaChegada.Rows[rowIndex].Cells[4].Value == null)
                        this.dgvSaidaChegada.Rows[rowIndex].Cells[4].Value = DateTime.Now.ToShortTimeString();
                    else
                        this.dgvSaidaChegada.Rows[rowIndex].Cells[5].Value = DateTime.Now.ToShortTimeString();
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }
        #endregion
        #endregion

        #region *** Métodos ***

        private List<BESaidaChegada> montarSaidaChegada()
        {
            List<BESaidaChegada> saidasChegadas = new List<BESaidaChegada>();

            BESaidaChegada entidade;
            foreach (DataGridViewRow row in dgvSaidaChegada.Rows)
            {
                if (row.Cells[0].Value != null && bool.Parse(row.Cells[0].Value.ToString()) && row.Cells[4].Value != null)
                {
                    entidade = new BESaidaChegada();

                    entidade.CodigoVenda = int.Parse(row.Cells[1].Value.ToString());
                    entidade.CodigoMotoboy = int.Parse(this.cboMotoboy.SelectedValue.ToString());
                    entidade.HoraSaida = row.Cells[4].Value.ToString();

                    if (row.Cells[5].Value != null)
                        entidade.HoraChegada = row.Cells[5].Value.ToString();

                    saidasChegadas.Add(entidade);
                }
            }

            return saidasChegadas;
        }

        private void carregarSaidaChegada()
        {
            try
            {
                if (int.Parse(this.cboMotoboy.SelectedValue.ToString()) > 0)
                {
                    List<BESaidaChegada> saidaChegadas = processSaidaChegada.ObterTodosEmAberto(int.Parse(this.cboMotoboy.SelectedValue.ToString()));

                    if (saidaChegadas.Count == 0)
                        this.dgvSaidaChegada.DataSource = new List<BESaidaChegada>();
                    else
                        this.dgvSaidaChegada.DataSource = saidaChegadas.OrderByDescending(q => q.Codigo).ToList();
                }
                else
                {
                    List<BESaidaChegada> saidaChegadas = processSaidaChegada.ObterTodosEmAberto(0);
                    this.dgvSaidaChegada.DataSource = saidaChegadas;
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void marcarDiaAtual()
        {
            try
            {
                if (config.AplicaPromocaoDiaria)
                {

                    switch (DateTime.Today.DayOfWeek)
                    {
                        case DayOfWeek.Friday:
                            this.rdbSexta.Checked = true;
                            break;
                        case DayOfWeek.Monday:
                            this.rdbSegunda.Checked = true;
                            break;
                        case DayOfWeek.Saturday:
                            this.rdbSabado.Checked = true;
                            break;
                        case DayOfWeek.Sunday:
                            this.rdbDomingo.Checked = true;
                            break;
                        case DayOfWeek.Thursday:
                            this.rdbQuinta.Checked = true;
                            break;
                        case DayOfWeek.Tuesday:
                            this.rdbTerca.Checked = true;
                            break;
                        case DayOfWeek.Wednesday:
                            this.rdbQuarta.Checked = true;
                            break;
                        default:
                            break;
                    }
                }
                else
                {
                    this.rdbDomingo.Enabled = false;
                    this.rdbSegunda.Enabled = false;
                    this.rdbTerca.Enabled = false;
                    this.rdbQuarta.Enabled = false;
                    this.rdbQuinta.Enabled = false;
                    this.rdbSexta.Enabled = false;
                    this.rdbSabado.Enabled = false;

                    this.lblPromocaoDiariaDesabilitada.Visible = true;
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private List<BEPagamento> montarPagamentos()
        {
            try
            {
                List<BEPagamento> pagamentos = new List<BEPagamento>();
                BEPagamento entidade;
                foreach (var item in formasPagamento)
                {
                    entidade = new BEPagamento();
                    entidade.CodigoTipoPagamento = item.Key;
                    entidade.Valor = item.Value;

                    pagamentos.Add(entidade);
                }

                return pagamentos;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
                return new List<BEPagamento>();
            }
        }

        private void consultarCliente()
        {
            try
            {
                List<BECliente> lista = processCliente.BuscarClienteVenda(this.txtTelefone.Text);

                if (lista == null || lista.Count == 0)
                {
                    this.LimparCamposCliente();
                    this.cliente = new BECliente();
                    if (MessageBox.Show("Cliente não encontrado. Deseja inserir um novo?", Utilidades.GetProjectName(), MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == System.Windows.Forms.DialogResult.Yes)
                    {
                        FrmClienteReduzido frm = new FrmClienteReduzido();
                        frm.realizandoVenda = true;
                        frm.telefone = this.txtTelefone.Text;
                        frm.ShowDialog();

                        BECliente entidade = frm.entidade;
                        if (entidade != null)
                            preencherDadosCliente(entidade);
                    }
                }
                else
                {
                    BECliente cliente = lista.First();
                    preencherDadosCliente(cliente);
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void preencherDadosCliente(BECliente cliente)
        {
            try
            {
                this.lblNome.Text = cliente.Nome;
                UtilidadesListas.carregarEnderecosCliente(cboEndereco, cliente);
                this.cboTaxaEntrega.SelectedValue = cliente.CodigoRegiaoEntrega;
                this.lblPizzaContador.Text = "Este cliente possui " + cliente.NumeroContadorPizza + " pizza(s).";
                this.txtCodigo.Focus();
                this.cliente = cliente;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void atualizarPreco()
        {
            try
            {
                BEProduto produto = null;
                BEProduto produtoMetade = null;
                decimal valor = 0;
                if (!String.IsNullOrEmpty(this.txtCodigo.Text))
                    produto = todosProdutos.Where(q => q.Codigo == int.Parse(this.txtCodigo.Text)).First();

                if (!String.IsNullOrEmpty(this.txtCodigoMetade.Text))
                    produtoMetade = todosProdutos.Where(q => q.Codigo == int.Parse(this.txtCodigoMetade.Text)).First();

                if (produto != null && this.cboTamanho.SelectedValue != null &&
                    this.cboTamanho.SelectedValue.ToString() != "0" && !String.IsNullOrEmpty(this.txtQuantidade.Text))
                {
                    int codigoTamanho = int.Parse(this.cboTamanho.SelectedValue.ToString());

                    BPSubGrupoTamanho subGrupoTamanhoProcess = new BPSubGrupoTamanho();
                    BESubGrupoTamanho subGrupoTamanho = null;
                    if (produto != null)
                    {
                        subGrupoTamanho = subGrupoTamanhoProcess.ObterEntidade(produto.CodigoSubGrupo, codigoTamanho);
                        if (subGrupoTamanho != null)
                            valor = subGrupoTamanho.Preco;
                        else
                            Utilidades.ExibirMensagem("Atenção, produto está sem preço.");
                    }

                    if (produtoMetade != null)
                    {
                        subGrupoTamanho = subGrupoTamanhoProcess.ObterEntidade(produtoMetade.CodigoSubGrupo, codigoTamanho);
                        if (subGrupoTamanho != null)
                        {
                            decimal valorTemp = subGrupoTamanho.Preco;
                            if (valorTemp > valor)
                                valor = valorTemp;
                        }
                        else
                            Utilidades.ExibirMensagem("Atenção, produto(metade) está sem preço.");
                    }

                    if (this.chkCupom.Checked)
                    {
                        if (this.chkBorda.Checked && !this.rdbQuinta.Checked)
                            valor += config.ValorBorda;

                        if (this.chkBorda.Checked && !this.rdbQuinta.Checked)
                        {
                            this.txtValorUnitario.Text = valor.ToString("N2");
                            //Caso tenha a borda, o valor total fica a borda(3,00) * Quantidade de pizzas
                            this.txtValorTotal.Text = (config.ValorBorda * int.Parse(this.txtQuantidade.Text)).ToString("N2");
                        }
                        else
                        {
                            this.txtValorUnitario.Text = valor.ToString("N2");
                            this.txtValorTotal.Text = "0,00";
                        }
                    }
                    else
                    {
                        decimal valorTotal;
                        if (config.AplicaPromocaoDiaria)
                            processVenda.aplicarPromocoes(produto, int.Parse(this.txtQuantidade.Text), ref valor, out valorTotal,
                                                         subGrupoTamanho, listaItens, ObterDiaSelecionado(), this.chkBorda.Checked, config);
                        else
                        {
                            if (this.chkBorda.Checked)
                                valor += config.ValorBorda;

                            valorTotal = valor * int.Parse(this.txtQuantidade.Text);
                        }

                        this.txtValorUnitario.Text = valor.ToString("N2");
                        this.txtValorTotal.Text = valorTotal.ToString("N2");
                    }
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private DayOfWeek ObterDiaSelecionado()
        {
            if (this.rdbDomingo.Checked)
                return DayOfWeek.Sunday;
            else if (this.rdbSegunda.Checked)
                return DayOfWeek.Monday;
            else if (this.rdbTerca.Checked)
                return DayOfWeek.Tuesday;
            else if (this.rdbQuarta.Checked)
                return DayOfWeek.Wednesday;
            else if (this.rdbQuinta.Checked)
                return DayOfWeek.Thursday;
            else if (this.rdbSexta.Checked)
                return DayOfWeek.Friday;
            else
                return DayOfWeek.Saturday;
        }

        private bool ValidarFormularioItem()
        {
            if (String.IsNullOrEmpty(this.txtCodigo.Text) || this.cboItem.SelectedValue.ToString() == "0")
            {
                Utilidades.ExibirMensagem("Campo Item é obrigatório.");
                this.txtCodigo.Focus();
                return false;
            }

            if (this.cboTamanho.SelectedValue.ToString() == "0")
            {
                Utilidades.ExibirMensagem("Campo Tamanho é obrigatório.");
                this.cboTamanho.Focus();
                return false;
            }

            if (String.IsNullOrEmpty(this.txtQuantidade.Text))
            {
                Utilidades.ExibirMensagem("Campo Quantidade é obrigatório.");
                this.txtQuantidade.Focus();
                return false;
            }

            return true;
        }

        private void LimparCamposItem()
        {
            this.txtCodigo.Apagar();
            this.txtCodigoMetade.Apagar();
            this.cboItem.SelectedValue = 0;
            this.cboMetade.SelectedValue = 0;
            this.txtQuantidade.Text = "1";
            this.cboTamanho.SelectedValue = 0;
            this.txtValorTotal.Apagar();
            this.txtValorUnitario.Apagar();
            this.txtCodigoBorda.Apagar();
            this.txtObservacaoItem.Apagar();
            this.chkBorda.Checked = false;
            this.btnAdicionar.Text = "Adicionar";
            this.chkCupom.Checked = false;
        }

        private void carregarRegiaoEntrega()
        {
            try
            {
                List<BERegiaoEntrega> lista = processRegiaoEntrega.ObterTodos(new FERegiaoEntrega()).OrderBy(q => q.Nome).ToList();

                BERegiaoEntrega selecione = new BERegiaoEntrega();
                selecione.Codigo = 0;
                selecione.Nome = "Selecione...";

                lista.Insert(0, selecione);

                cboTaxaEntrega.DataSource = lista;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void carregarTamanho(int codigoSubGrupo)
        {
            try
            {
                Object valorAntigo = this.cboTamanho.SelectedItem;

                List<BESubGrupoTamanho> lista = processSubGrupoTamanho.ObterTodos(new FESubGrupoTamanho() { CodigoSubGrupo = codigoSubGrupo }).ToList();
                List<BETamanho> tamanhos = new List<BETamanho>();

                foreach (BESubGrupoTamanho item in lista)
                    tamanhos.Add(item.Tamanho);

                tamanhos = tamanhos.OrderBy(q => q.Sigla).ToList();
                BETamanho selecione = new BETamanho();
                selecione.Codigo = 0;
                selecione.Sigla = "Sel...";
                tamanhos.Insert(0, selecione);

                cboTamanho.DataSource = tamanhos;

                if (valorAntigo != null && valorAntigo.ToString() != "Sel...")
                {
                    if (this.cboTamanho.Items.Contains(valorAntigo))
                        this.cboTamanho.SelectedItem = valorAntigo;
                    else
                        if (tamanhos.Count > 1)
                        this.cboTamanho.SelectedIndex = 1;
                }
                else
                    if (tamanhos.Count > 1)
                    this.cboTamanho.SelectedIndex = 1;

                this.cboTamanho.Enabled = true;
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void carregarProdutos()
        {
            try
            {
                List<BEProduto> lista;

                lista = processProduto.ObterTodos(new FEProduto() { Ativo = true }).OrderBy(q => q.Descricao).ToList();

                BEProduto selecione = new BEProduto();
                selecione.Codigo = 0;
                selecione.Descricao = "Selecione...";
                selecione.SubGrupo = new BESubGrupo();
                selecione.SubGrupo.CodigoGrupo = 0;

                lista.Insert(0, selecione);

                todosProdutos = lista;
                cboItem.DataSource = new List<BEProduto>(lista);
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private bool ValidarFormulario()
        {
            if (String.IsNullOrEmpty(this.txtTelefone.Text))
            {
                Utilidades.ExibirMensagem("Campo TELEFONE obrigatório.");
                return false;
            }

            if (String.IsNullOrEmpty(this.lblNome.Text))
            {
                Utilidades.ExibirMensagem("Campo NOME obrigatório, favor selecionar um telefone cadastrado.");
                return false;
            }

            if (this.cboTaxaEntrega.SelectedValue.ToString() == "0")
            {
                Utilidades.ExibirMensagem("Campo TAXA DE ENTREGA obrigatório.");
                return false;
            }

            if (String.IsNullOrEmpty(this.cboEndereco.Text))
            {
                Utilidades.ExibirMensagem("Campo ENDEREÇO obrigatório.");
                return false;
            }

            if (listaItens == null || listaItens.Count == 0)
            {
                Utilidades.ExibirMensagem("Favor escolher no mínimo um item.");
                return false;
            }

            if (String.IsNullOrEmpty(this.txtTotalVenda.Text))
            {
                Utilidades.ExibirMensagem("Campo TOTAL VENDA obrigatório");
                return false;
            }

            if (String.IsNullOrEmpty(this.txtTaxaEntrega.Text))
            {
                Utilidades.ExibirMensagem("Campo TAXA ENTREGA obrigatório");
                return false;
            }

            if (String.IsNullOrEmpty(this.txtTotal.Text))
            {
                Utilidades.ExibirMensagem("Campo TOTAL obrigatório");
                return false;
            }
            else
            {
                if (this.txtTotal.Valor > this.txtTotalPago.Valor)
                {
                    Utilidades.ExibirMensagem("Valor total ultrapassa o valor total pago. Verifique as formas de pagamento.");
                    return false;
                }
            }

            if (formasPagamento == null)
            {
                Utilidades.ExibirMensagem("Por favor, selecione uma forma de pagamento pressionando 'F1'.");
                return false;
            }
            return true;
        }

        private void LimparCampos()
        {
            try
            {
                this.lblCodigo.Text = "...";
                this.txtTelefone.Apagar();
                this.txtTotal.Text = "0,00";
                this.txtTotalPago.Text = "0,00";
                this.txtTotalVenda.Text = "0,00";
                this.txtTaxaEntrega.Text = "0,00";
                this.txtTroco.Text = "0,00";
                this.txtObservacao.Apagar();
                this.txtBorda.Apagar();
                this.txtCodigoBorda.Apagar();
                this.txtDesconto.Text = "0,00";
                this.txtAcrescimo.Text = "0,00";
                this.formasPagamento = null;
                this.listaItens.RemoveRange(0, listaItens.Count);
                this.dgvItem.DataSource = new object();
                this.dgvItem.DataSource = listaItens;

                this.LimparCamposCliente();
                this.marcarDiaAtual();
                this.LimparCamposItem();
                this.txtTelefone.Focus();

                this.btnConfirmar.Visible = true;
                this.btnImprimir.Visible = false;
                this.btnAdicionar.Text = "Adicionar";
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void calcularTotalVenda()
        {
            try
            {
                decimal totalVenda = listaItens.Sum(q => q.ValorTotal);
                decimal total = totalVenda;
                if (!String.IsNullOrEmpty(this.txtTaxaEntrega.Text))
                    total += this.txtTaxaEntrega.Valor;

                if (!String.IsNullOrEmpty(this.txtDesconto.Text))
                    total -= this.txtDesconto.Valor;

                if (!String.IsNullOrEmpty(this.txtAcrescimo.Text))
                    total += this.txtAcrescimo.Valor;

                this.txtTotal.Text = total.ToString("N2");
                this.txtTotalVenda.Text = totalVenda.ToString("N2");

                calcularTroco();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void calcularTroco()
        {
            try
            {
                if (!String.IsNullOrEmpty(this.txtTotal.Text) && !String.IsNullOrEmpty(this.txtTotalPago.Text))
                {
                    decimal troco = this.txtTotalPago.Valor - this.txtTotal.Valor;
                    if (troco > 0)
                        this.txtTroco.Text = troco.ToString("N2");
                    else
                        this.txtTroco.Text = "0,00";

                    this.txtTotalPago.Text = this.txtTotalPago.Valor.ToString("N2");
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void LimparCamposCliente()
        {
            this.lblNome.Text = "...";
            this.lblPizzaContador.Text = "...";
            this.cboEndereco.DataSource = null;
            this.cboEndereco.Text = String.Empty;
            this.cboEndereco.SelectedIndex = -1;
            this.cboTaxaEntrega.SelectedValue = 0;
            this.cliente = null;
        }

        private void ImprimirVenda()
        {
            try
            {
                if (entidade != null)
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Append("Cod : ");
                    sb.Append(entidade.Codigo.ToString());
                    sb.Append(" - ");
                    sb.Append(entidade.DataVenda.ToShortDateString() + " " + entidade.Hora.ToString());
                    sb.Append(" - ");
                    sb.AppendLine(entidade.Cliente.Nome);
                    sb.Append("End : ");
                    sb.AppendLine(entidade.EnderecoEntrega.Endereco);
                    sb.Append("Tel : ");
                    sb.AppendLine(this.txtTelefone.Text);
                    sb.Append("Forma Pagamento : ");
                    sb.AppendLine(descricaoPagamento);
                    sb.Append("Total(R$) : ");
                    sb.AppendLine(this.txtTotal.Text);
                    sb.Append("Troco(R$) : ");
                    sb.AppendLine(this.txtTroco.Text);
                    sb.Append("Total Pago(R$) : ");
                    sb.AppendLine(this.txtTotalPago.Text);

                    if (!String.IsNullOrEmpty(this.txtObservacao.Text))
                    {
                        sb.Append("OBS : ");
                        sb.AppendLine(this.txtObservacao.Text);
                    }

                    sb.AppendLine("------------------ITENS------------------");
                    sb.AppendLine("QTD - TM - DESCRICAO");
                    foreach (BEVendaItem item in entidade.Itens)
                    {
                        sb.Append(item.Quantidade.ToString().PadLeft(3, '0') + " - ");
                        sb.Append(item.SiglaTamanho.PadRight(2, ' ') + " - ");
                        if (item.CodigoProdutoMetade > 0)
                            sb.AppendLine("1/2 " + item.NomeProduto + " - 1/2 " + item.NomeProdutoMetade);
                        else
                            sb.AppendLine(item.NomeProduto);

                        if (item.Borda.HasValue && item.Borda.Value)
                            sb.AppendLine("           Borda : " + ((Bordas)item.TipoBorda).ToString());

                        if (!String.IsNullOrEmpty(item.Observacao))
                            sb.AppendLine("           OBS   : " + item.Observacao);
                    }

                    sb.AppendLine();
                    sb.AppendLine();
                    sb.AppendLine();
                    sb.AppendLine();

                    IPrinter impressora = PrinterFactory.getPrinter(config.CodigoImpressora.Value);
                    impressora.imprimir(sb.ToString().ToUpper());

                    if (MessageBox.Show("Deseja imprimir segunda via?", Utilidades.GetProjectName(), MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == System.Windows.Forms.DialogResult.Yes)
                        impressora.imprimir(sb.ToString().ToUpper());
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void carregarVenda(BEVenda venda)
        {
            try
            {
                this.lblCodigo.Text = venda.Codigo.ToString();

                //Dados cliente
                this.cliente = venda.Cliente;
                this.txtTelefone.Text = venda.Cliente.TelResidencial.Insert(4, "-");
                preencherDadosCliente(this.cliente);

                //Dados endereço
                UtilidadesListas.carregarEnderecosCliente(cboEndereco, venda.Cliente);
                this.cboEndereco.SelectedValue = venda.CodigoEnderecoEntrega;

                //Itens
                this.listaItens = processVenda.ObterItensVenda(venda.Codigo);
                this.dgvItem.DataSource = new object();
                this.dgvItem.DataSource = listaItens;

                this.LimparCamposItem();

                //Pagamento
                descricaoPagamento = String.Empty;
                formasPagamento = new Dictionary<int, decimal>();

                venda.Pagamentos = processVenda.ObterPagamentosVenda(venda.Codigo);
                foreach (BEPagamento pag in venda.Pagamentos)
                {
                    formasPagamento.Add(pag.CodigoTipoPagamento, pag.Valor);
                    descricaoPagamento += pag.TipoPagamento.Descricao + "; ";
                }

                if (descricaoPagamento.Length > 2)
                    descricaoPagamento = descricaoPagamento.Remove(descricaoPagamento.Length - 2);

                //Taxas
                this.txtTotal.Text = venda.ValorTotal.ToString("N2");
                this.txtTroco.Text = venda.ValorTroco.ToString("N2");
                this.txtDesconto.Text = venda.Desconto.ToString("N2");
                this.txtAcrescimo.Text = venda.Acrescimo.ToString("N2");
                this.txtTotalPago.Text = formasPagamento.Sum(q => q.Value).ToString("N2");
                calcularTotalVenda();

                entidade = venda;
                entidade.Itens = new List<BEVendaItem>(listaItens);
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void executarF12()
        {
            try
            {
                FrmVendaConsultar frmConsulta = new FrmVendaConsultar();
                frmConsulta.ShowDialog();

                if (frmConsulta.entidade != null)
                {
                    carregarVenda(frmConsulta.entidade);
                    this.btnImprimir.Visible = true;
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void executarF11()
        {
            try
            {
                if (cliente != null)
                {
                    FrmClienteHistorico frm = new FrmClienteHistorico();
                    frm.codigoCliente = cliente.Codigo;
                    frm.ShowDialog();

                    if (frm.entidade != null)
                    {
                        carregarVenda(frm.entidade);
                        this.btnImprimir.Visible = true;
                    }
                }
                else
                    Utilidades.ExibirMensagem("Selecione um cliente.");
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void executarF10()
        {
            try
            {
                if (cliente != null)
                {
                    FrmClienteReduzido frm = new FrmClienteReduzido();
                    frm.entidade = cliente;
                    frm.realizandoVenda = true;
                    frm.ShowDialog();

                    if (frm.entidade != null)
                    {
                        this.cliente.Nome = frm.entidade.Nome;
                        this.cliente.TelResidencial = frm.entidade.TelResidencial;
                        this.cliente.CodigoRegiaoEntrega = frm.entidade.CodigoRegiaoEntrega;
                        this.cliente.Endereco = frm.entidade.Endereco;
                        this.cliente.PontoReferencia = frm.entidade.PontoReferencia;
                        preencherDadosCliente(this.cliente);
                    }
                }
                else
                    Utilidades.ExibirMensagem("Selecione um cliente.");
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void executarF2()
        {
            try
            {
                if (this.lblCodigo.Text != "...")
                {
                    if (!entidade.Cancelada)
                    {
                        FrmVendaCancelar frmCancelar = new FrmVendaCancelar();
                        frmCancelar.ShowDialog();

                        if (!String.IsNullOrEmpty(frmCancelar.Motivo))
                        {
                            processVenda.Cancelar(Convert.ToInt32(this.lblCodigo.Text), frmCancelar.Motivo);
                            Utilidades.ExibirMensagem("Pedido cancelado com sucesso.");
                            btnLimpar.PerformClick();
                        }
                    }
                    else
                        Utilidades.ExibirMensagem("Este pedido já está cancelado.");
                }
                else
                    Utilidades.ExibirMensagem("Este pedido ainda não foi confirmado, portanto não tem como cancelá-lo.");
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
            }

        }
        private static void executarF8()
        {
            try
            {
                FrmSaidaChegada frmSaidaChegada = new FrmSaidaChegada();
                frmSaidaChegada.ShowDialog();
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void executarF1()
        {
            try
            {
                if (String.IsNullOrEmpty(this.txtTotal.Text) || this.txtTotal.Text == "0,00")
                    Utilidades.ExibirMensagem("Valor do total não pode ser igual a 0,00");
                else
                {
                    Decimal valor = decimal.Parse(this.txtTotal.Text);

                    FrmVendaPagamento frm = new FrmVendaPagamento();
                    frm.valorVenda = valor;
                    frm.valores = formasPagamento;
                    frm.ShowDialog();

                    if (frm.valores != null)
                    {
                        formasPagamento = frm.valores;

                        this.txtTotalPago.Text = frm.valorPagamento.ToString();

                        descricaoPagamento = frm.descricaoPagamento;
                        calcularTotalVenda();
                        calcularTroco();
                    }
                }
            }
            catch (Exception ex)
            {
                Utilidades.LogarError(ex);
                MessageBox.Show(Utilidades.BuscarMensagemError());
            }
        }

        private void adicionaBebida(BEVendaItem item)
        {
            for (int i = 0; i < item.Quantidade; i++)
            {
                FrmBebidas bebidas = new FrmBebidas();
                bebidas.ShowDialog();

                if (bebidas.entidade != null)
                {
                    BEVendaItem itemBebida = new BEVendaItem();
                    itemBebida.Produto = bebidas.entidade;
                    itemBebida.Produto.SubGrupo = new BESubGrupo()
                    {
                        Codigo = itemBebida.Produto.CodigoSubGrupo,
                        CodigoGrupo = config.CodigoGrupoBebida
                    };

                    BESubGrupoTamanho subGrupoTamanho = tamanhosBebidas.Where(q => q.CodigoSubGrupo == itemBebida.Produto.CodigoSubGrupo).First();
                    itemBebida.Tamanho = subGrupoTamanho.Tamanho;

                    itemBebida.Desconto = 0;
                    itemBebida.Quantidade = 1;

                    //Se for suco, o valor é 1 real
                    if (subGrupoTamanho.CodigoSubGrupo == config.CodigoSubGrupoSuco)
                    {
                        itemBebida.ValorUnitario = 1;
                        itemBebida.ValorTotal = 1;
                    }
                    else
                    {
                        itemBebida.ValorUnitario = 0;
                        itemBebida.ValorTotal = 0;
                    }

                    itemBebida.Borda = false;
                    itemBebida.Cupom = false;
                    itemBebida.Observacao = String.Empty;

                    listaItens.Add(itemBebida);
                }
            }
        }
        #endregion


    }
}
